/*************************************************************************
	> File Name: oj-527_birdman.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月18日 星期三 20时31分12秒
 ************************************************************************/

#include <iostream>
#include <queue>
using namespace std;

struct node {
    //多了一个维度
    //表示到这个点剩余的能量
    int x, y, step, d;
};

//mark 去重数组，第三维度表示每一种剩余能量的情况
//剩余能量可以从0~100
//比如说到x, y点剩余能量为1的情况下走过，标记为1
//又比如到x, y点剩余能量为2的情况下走过，标记为1
//这两种情况是不同的，分别记录并去重
//因为到达同一个点的剩余能量状态可能不同
//可能是飞过来的，可能是走过来的
int n, m, d, mark[105][105][105];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
char mmap[105][105];

int main() {
    cin >> n >> m >> d;
    for (int i = 1; i <= n; ++i) {
        cin >> &mmap[i][1];
    }
    //开始搜索
    queue<node> que;
    //起点状态放入队列
    que.push((node){1, 1, 0, d});
    for (int i = 0; i <= d; ++i) {
        //起点的能量标记为1
        mark[1][1][i] = 1;
    }
    while (!que.empty()) {
        //拿出搜索节点
        node temp = que.front();
        que.pop();
        for (int i = 0; i < 4; ++i) {
            //方案1 飞
            //从能量为2开始飞，飞到剩余能量为止
            //因为中途不能落地，飞跃一个点需要的能量为2
            //至少需要2能量，至多不超过temp.d
            for (int j = 2; j <= temp.d; ++j) {
                //能飞到的点
                int x = temp.x + dir[i][0] * j;
                int y = temp.y + dir[i][1] * j;
                //判断是否越界
                if (x < 1 || y < 1 || x > n || y > m) {
                    break;
                }
                //如果没越界，判断是否终点
                if (x == n && y == m) {
                    cout << temp.step + 1 << endl;
                    return 0;
                }
                //如果是平地
                if (mmap[x][y] == 'P' && mark[x][y][temp.d - j] == 0) {
                    //飞行耗费了j能量，所以剩余能量为temp.d - j
                    que.push((node){x, y, temp.step + 1, temp.d - j});
                    mark[x][y][temp.d - j] = 1;
                }
            }
            //方案2 走
            int x = temp.x + dir[i][0];
            int y = temp.y + dir[i][1];
            //判断是否终点
            if (x == n && y == m) {
                cout << temp.step + 1 << endl;
                return 0;
            }
            //如果是平地没走过
            if (mmap[x][y] == 'P' && mark[x][y][temp.d] == 0) {
                que.push((node){x, y, temp.step + 1, temp.d});
                mark[x][y][temp.d] = 1;
            }
        }
    }
    //如果搜索队列为空还没找到终点，就无法到达
    cout << "impossible" << endl;
    return 0;
}
